library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(sf)
## Linking to GEOS 3.9.1, GDAL 3.3.2, PROJ 7.2.1; sf_use_s2() is TRUE
library(leaflet)
## Warning: package 'leaflet' was built under R version 4.2.1
library(DT)
library(readr)
library(ggplot2)
library(plotly)
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✔ tibble  3.1.7     ✔ stringr 1.4.0
## ✔ tidyr   1.2.0     ✔ forcats 0.5.1
## ✔ purrr   0.3.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ plotly::filter() masks dplyr::filter(), stats::filter()
## ✖ dplyr::lag()     masks stats::lag()
library(terra)
## Warning: package 'terra' was built under R version 4.2.1
## terra 1.5.34
## 
## Attaching package: 'terra'
## The following object is masked from 'package:tidyr':
## 
##     extract
library(sf)
library(stringi)
library(readxl)
cantones <- 
  st_read(dsn = "C:/Users/Bryan/OneDrive/Desktop/Procesamiento de Datos/Tarea3/cantones_simplificados.geojson", quiet = TRUE) %>%
  st_transform(4326)

# Transformación de datos de cantones
estadisticas_policiales <-
 readxl::read_excel ("C:/Users/Bryan/OneDrive/Desktop/Procesamiento de Datos/Tarea3/estadisticaspoliciales2021.xls"
  )

Mapa de cantones

# Lectura
cantones <-
  st_read(
    dsn = "C:/Users/Bryan/OneDrive/Desktop/Procesamiento de Datos/Tarea3/cantones_simplificados.geojson",
    quiet = TRUE
  ) %>%
  st_transform(4326) # transformación a WGS84

# Transformación
cantones <-
  cantones %>%
  st_transform(5367) %>%
  st_simplify(dTolerance = 100) %>% # simplificación de geometrías
  st_transform(4326)
# En el data frame de cantones
cantones <-
  cantones %>%
  mutate(canton_normalizado = tolower(stri_trans_general(canton, id = "Latin-ASCII")))

delitos <-
  read_xls(path = "C:/Users/Bryan/OneDrive/Desktop/Procesamiento de Datos/Tarea3/estadisticaspoliciales2021.xls")

# En el data frame de delitos
delitos <-
  delitos %>%
  mutate(canton_normalizado = tolower(stri_trans_general(Canton, id = "Latin-ASCII")))


delitos %>%
  left_join(
    dplyr::select(st_drop_geometry(cantones),
                  canton_normalizado, cod_canton),
    by = "canton_normalizado",
    copy = FALSE,
    keep = FALSE
  ) %>%
  filter(is.na(cod_canton) & canton_normalizado != "desconocido") %>% # los cod_canton = NA son los que no están en el data frame de cantones
  distinct(canton_normalizado)
## # A tibble: 2 × 1
##   canton_normalizado 
##   <chr>              
## 1 leon cortes        
## 2 vasquez de coronado
# Corrección de nombres de cantones en delitos
delitos <-
  delitos %>%
  mutate(Canton = if_else(Canton == "LEON CORTES", "LEON CORTES CASTRO", Canton)) %>%
  mutate(Canton = if_else(Canton == "VASQUEZ DE CORONADO", "VAZQUEZ DE CORONADO", Canton))

# Se realiza nuevamente esta operación para reflejar los cambios en los nombres de cantones
delitos <-
  delitos %>%
  mutate(canton_normalizado = tolower(stri_trans_general(Canton, id = "Latin-ASCII")))

# Revisión
delitos %>%
  left_join(
    dplyr::select(st_drop_geometry(cantones),
                  canton_normalizado, cod_canton),
    by = "canton_normalizado",
    copy = FALSE,
    keep = FALSE
  ) %>%
  filter(is.na(cod_canton) & canton_normalizado != "desconocido") %>% # los cod_canton = NA son los que no están en el data frame de cantones
  distinct(canton_normalizado)
## # A tibble: 0 × 1
## # … with 1 variable: canton_normalizado <chr>
# Unión del código de cantón a delitos
delitos <-
  delitos %>%
  left_join(
    dplyr::select(
      st_drop_geometry(cantones),
      cod_canton,
      canton_normalizado
    ),
    by = "canton_normalizado",
    copy = FALSE,
    keep = FALSE
  )

# Conteo de registros por código de cantón
delitos_x_canton <-
  delitos %>%
  count(cod_canton, name = "delitos")

# Unión de cantidad de delitos por cantón a cantones
cantones_delitos <-
  cantones %>%
  left_join(
    delitos_x_canton,
    by = "cod_canton",
    copy = FALSE,
    keep = FALSE
  )

# Paleta de colores para los mapas
colores_cantones_delitos <-
  colorNumeric(palette = "Blues",
               domain = cantones_delitos$delitos,
               na.color = "transparent")

# Mapa leaflet de delitos en cantones
leaflet() %>%
  setView(# centro y nivel inicial de acercamiento
    lng = -84.19452,
    lat = 9.572735,
    zoom = 7) %>%
  addTiles(group = "OpenStreetMap") %>% # capa base
  addPolygons(
    # capa de polígonos
    data = cantones_delitos,
    fillColor = ~ colores_cantones_delitos(cantones_delitos$delitos),
    fillOpacity = 0.8,
    color = "black",
    stroke = TRUE,
    weight = 1.0,
    popup = paste(
      # ventana emergente
      paste(
        "<strong>Cantón:</strong>",
        cantones_delitos$canton
      ),
      paste(
        "<strong>Delitos:</strong>",
        cantones_delitos$delitos
      ),
      sep = '<br/>'
    ),
    group = "Delitos en cantones"
  ) %>%
  addLayersControl(
    # control de capas
    baseGroups = c("OpenStreetMap"),
    overlayGroups = c("Delitos en cantones")
  ) %>%
  addLegend(
    # leyenda
    position = "bottomleft",
    pal = colores_cantones_delitos,
    values = cantones_delitos$delitos,
    group = "Delitos",
    title = "Cantidad de delitos"
  )

Tabla

# Transformación de datos de cantones
estadisticas_policiales <-
 readxl::read_excel ("C:/Users/Bryan/OneDrive/Desktop/Procesamiento de Datos/Tarea3/estadisticaspoliciales2021.xls"
  )

# Transformación de datos 
estadisticas_policiales <-
  estadisticas_policiales %>%     
  select(Delito= Delito, Fecha, Victima, Edad, Genero = Genero, Provincia, Canton) %>%  
  mutate(Fecha = as.Date(Fecha, format = "%d/%m/%Y"))

# Visualización de datos en formato tabular
estadisticas_policiales %>%  
  datatable( 
    colnames = c("Delito", "Fecha", "Victima", "Edad", "Genero", "Provincia", "Canton"),
    options = list(
    pageLength = 5,
    language = list(url = '//cdn.datatables.net/plug-ins/1.10.11/i18n/Spanish.json')
  ))
## Warning in instance$preRenderHook(instance): It seems your data is too big
## for client-side DataTables. You may consider server-side processing: https://
## rstudio.github.io/DT/server.html

Grafico

ggplot2_barras_proporcion <-
  estadisticas_policiales %>%  
  ggplot(aes(x = Delito, y = stat(count), group = 100)) +
  geom_bar() +
  ggtitle("Tipos de Delitos") +
  xlab("Delito") +
  ylab("Cantidad") +
  theme_minimal()

ggplotly(ggplot2_barras_proporcion) %>% config(locale = 'es')

Grafico por victima

Grafico por mes

Grafico barras apiladas

ggplot2_barras_apiladas_cantidad <-
  estadisticas_policiales %>%
  ggplot(aes(x = Delito, fill = Genero)) +
  geom_bar(position = "fill") +
  ggtitle("Proporcion de delito por genero") +
  xlab("Delito") +
  ylab("Cantidad") +
  labs(fill = "Delito") +
  theme_minimal()

ggplotly(ggplot2_barras_apiladas_cantidad) %>% config(locale = 'es')